package com.itheima.controller;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.OSSObject;
import com.itheima.common.R;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.UUID;

@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {

    @Value("${reggie.path}")
    private String basePath;

    /**
     * 文件上传
     * 上传的步骤?
     */
    @PostMapping("/upload")
    //编写文件上传的方法, 通过MultipartFile类型的参数即可接收上传的文件
    //方法形参的名称需要与页面的file域的name属性一致。
    //spring 框架封装的  我们只需要在Controller的方法中声明一个MultipartFile类型的参数即可接收上传的文件
    public R<String> upload(MultipartFile file) throws IOException {

//        //  获取原始文件名
//        String originalFilename = file.getOriginalFilename();
//
//        // 分割出文件后缀名
//        String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
//
//        // UUID重新生成文件名,防止文件名相同覆盖
//
//        String fileName = UUID.randomUUID().toString() + substring;
//
//        //创建一个目录对象
//
//        File dir = new File(basePath);
//        // 判断当前目录是否存在 不存在就创建出来
//        if (!dir.exists()) {
//            // 创建该目录
//            dir.mkdir();
//        }
//
//        //将临时文件转存到指定位置  临时文件会会在请求完成后删除
//        file.transferTo(new File(basePath + fileName));
//
//        return R.success(fileName);
//
//    }
//
//    /**
//     * 下载文件
//     *
//     * @param name     图片文件的名称 由前端发送
//     * @param response 图片回显
//     * @throws Exception
//     */
//
//    @GetMapping("/download")
//    public void download(String name, HttpServletResponse response) throws Exception {
//
//        //创建输入流，通过输入流读取文件内容
//        FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));
//
//        //输出流，通过输出流将文件写回浏览器
//        ServletOutputStream outputStream = response.getOutputStream();
//
//        // 输入输出流 图片复写 图片文件下载
//        IOUtils.copy(fileInputStream, outputStream);
//
//        //关流
//        fileInputStream.close();
//        outputStream.close();
//
//    }
        //  获取原始文件名
        String originalFilename = file.getOriginalFilename();
        // 分割出文件后缀名
        String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
        // 组装成文件名
        String filename = UUID.randomUUID().toString() + substring;
        log.info("存储照片名称为" + filename);

        File file1 = new File(basePath);
        if (!file1.exists()) {
            file1.mkdirs();
        }
        try {
            file.transferTo(new File(basePath + filename));
            /*oss*/
            /*将图片上传到oss存储仓库*/
            // Endpoint以杭州为例，其它Region请按实际情况填写。
            String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
            // 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建RAM账号。
            String accessKeyId = "LTAI5t6BFmKPhMDJga9FfxJD";
            String accessKeySecret = "cz7El0hioQod9p8t7NyiK8p3JB0Vrg";
            String bucketName = "ncwqbucket";
            /*用户登录名称 pathjava@1072565818398598.onaliyun.com
             AccessKey ID
            AccessKey Secret */
            // <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径，例如abc/efg/123.jpg。
            String localFile = basePath + filename;
            String fileKeyName = filename;
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

            InputStream inputStream = new FileInputStream(localFile);
            ossClient.putObject(bucketName, "download/" + fileKeyName, inputStream);

            // 关闭OSSClient。
            ossClient.shutdown();

            return R.success(filename);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return R.error("下载失败");


    }

    /*图片下载*/
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) throws IOException {
        //创建输入流，通过输入流读取文件内容
//        FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));
//
//        //输出流，通过输出流将文件写回浏览器
//        ServletOutputStream outputStream = response.getOutputStream();
//
//        // 输入输出流 图片复写 图片文件下载
//        IOUtils.copy(fileInputStream, outputStream);
//
//        //关流
//        fileInputStream.close();
//        outputStream.close();
//

// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 从STS服务获取的临时访问密钥（AccessKey ID和AccessKey Secret）。
        String accessKeyId = "LTAI5t6BFmKPhMDJga9FfxJD";
        String accessKeySecret = "cz7El0hioQod9p8t7NyiK8p3JB0Vrg";
// 从STS服务获取的安全令牌（SecurityToken）。
        /* String securityToken = "yourSecurityToken";*/
// 填写Bucket名称，例如examplebucket。
        String bucketName = "ncwqbucket";
// 填写Object完整路径，例如exampleobject.txt。Object完整路径中不能包含Bucket名称。
        String objectName = "download/" + name;




// 从STS服务获取临时访问凭证后，您可以通过临时访问密钥和安全令牌生成OSSClient。
// 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 通过STS临时授权将Object下载本地文件。如果指定的本地文件存在则覆盖，不存在则新建。
// 如果未指定本地路径，则下载后的文件默认保存到示例程序所属项目对应本地路径中。
        OSSObject ossObject = ossClient.getObject(bucketName, objectName);
        response.setContentType("image/jpeg");
        ServletOutputStream outputStream = response.getOutputStream();
        InputStream fileInputStream = ossObject.getObjectContent();
       /* byte[] bytes = new byte[1024];
        int len = 0;
        while ((len = fileInputStream.read(bytes)) != -1) {
            outputStream.write(bytes, 0, len);
            outputStream.flush();
        }*/
        IOUtils.copy(fileInputStream, outputStream);
        outputStream.close();
        fileInputStream.close();
// 关闭OSSClient。
        ossClient.shutdown();
    }

}
